package com.summli.basic.class01;

/**
 * 二进制运算，&：与0为0，|：遇1为1，^:不进位加
 */
public class Class01_8_EvenTimesOddTimes {

    /**
     * 如何将一个int值的最右边位置的1找出来
     * a&(~a+1)
     */

    /**
     * 数组中只有一个数出现奇数次，其余都是偶数次，打印奇数次的数据
     * @param arr
     */
    private static void printOddTimesNum1(int[] arr){
        if(arr == null || arr.length == 0){
            return;
        }
        int result = 0;
        for (int i = 0; i < arr.length; i++) {
            result ^= arr[i];
        }
        System.out.println(result);
    }


    /**
     * 数组中出现奇数次的两个数，其余为偶数次，打印出奇数
     * @param arr
     */
    private static void printOddTimesNum2(int[] arr){
        if(arr == null || arr.length == 0){
            return;
        }
        int result=0;
        int temp;
        int a=0;
        for (int i = 0; i < arr.length; i++) {
            result ^= arr[i];
        }
        temp = result & (~result+1);
        for (int i = 0; i < arr.length; i++) {
            if((arr[i] & temp) == 0){
                a ^= arr[i];
            }
        }
        System.out.println(a);
        System.out.println(result ^ a);
    }

    public static void main(String[] args) {

        int[] arr1 = { 3, 3, 0, 3, 1, 1, 1, 3, 1, 1, 1 };
        printOddTimesNum1(arr1);

        int[] arr2 = { 4, 3, 4, 2, 2, 2, 4, 1, 1, 1, 3, 3, 1, 1, 1, 4, 2, 2 };
        printOddTimesNum2(arr2);

    }
}
